'''
函数的定义
def 函数名(参数列表):
    函数体
    return 返回值
'''
def add(a: int, b:int)->int:    
    # 参数类型注解  返回值类型注解  用于提示参数类型和返回值类型  不做强制性检查         
    if isinstance(a, int) and isinstance(b, int): # 判断参数类型 isinstance(参数,类型)  返回True或False
        return a + b 
    else:
        return "参数类型错误"
        # raise TypeError("参数类型错误")  # 抛出异常


def func(data):
    ''' 将字符串转换为列表'''
    return data.split(",")

def func1(data1, data2, data3="qwe"):
    '''
     关键字参数  传递参数时指定参数名  不按照顺序传递 传递参数时可以省略参数名
    '''
    print(data1, data2, data3)


def func2(data1, data2, data3):
    print(data1, data2, data3)

def fun3(port,*args,ip="127.0.0.1",**kwargs):  
    ''' 
    *args 代表可变参数  分装为元组
    **kwargs 代表关键字参数 分装为字典
    
    ''' 
    print("fun3:")
    print(port)
    print(args)
    print(ip)
    print(kwargs)


    
    
def sum(data): # 对列表求和
    a = 0
    for i in data:
        a += i
    return a

def mysum(*args):
    '''高阶函数'''
    # 位置参数封装成一个元组
    a = []
    for i in args:
        if isinstance(i, int):  # 判断是否为整数 是则添加到列表中
            a.append(i)
    return sum(data=a)




def is_passing(score):
    return score >= 60







  
# 匿名函数  一句话函数 lambda 参数列表:返回值
func5=lambda x:True if x%2==0 else False

def douyi():
    '''
# 闭包函数  
    1. 外部函数返回内部函数
    2. 内部函数引用外部函数的变量
    3. 外部函数返回内部函数
'''
    number=0
    def guanzhu(name):
        nonlocal number  # 声明number为非局部变量
        print(f'感谢{name}关注')
        number+=1
        print("当前关注人数",number)
        # return number
    return guanzhu # 注意这里不要加上括号 返回内部函数
 
# 闭包函数
def counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

count = counter()
print(count())  # 输出: 1
print(count())  # 输出: 2
print(count())  # 输出: 3



print(__name__)  # 返回当前模块的名字 如果是当前模块则返回__main__   用于判断是否调用当前模块

if __name__ == "__main__":  # 当前模块作为主模块运行时，执行以下代码  调用当前模块时不执行
    data =func("1,2,3")  
    print(data)
    print(func.__doc__)
    print(add(1, 1.2))
    print(add(1, 2))
    func1(data1=1, data2=2, data3=73)    # data3=73为实际传入参数
    func2(*data)  # *data  解包列表  将列表中的元素作为参数传递
    fun3(1,2,3,4)  # 1  (2, 3, 4) 
    fun3(1,2,3,4,name="杨盼春",age=20)  # 1  (2, 3, 4)  {'name': '杨盼春', 'age': 20}   

 
    print(func5(9))

    list1=[('小a',34),('小b',56),('小c',23)]
    list1.sort(key=lambda x:x[1])  # 按照列表中的第二个元素排序
    print(list1)


    guanzhu=douyi()
    guanzhu("小a")
    guanzhu("小b")


    d = mysum(10,5,23,33, "a",55,"w")
    print(d)

    students_scores = [55, 78, 62, 90, 45, 88, 72, 60]
    # filter 标准函数 过滤 传入一个函数和一个可迭代对象  返回一个迭代器对象
    # 判断students_scores中的元素是否 满足is_passing函数 则保留 存储在passing_scores中  不满足则过滤掉
    passing_scores = list(filter(is_passing, students_scores)) 
    print(f"及格的学生有: {len(passing_scores)}")



'''
偏函数
'''
from functools import partial  # 偏函数

money = 10000
def func(m,mode='in'):
    global money # 声明全局变量
    if mode=='in':
        money += m
    elif mode=='out':
        money -= m
    else:
        return "参数类型错误"
        # raise TypeError("参数类型错误")  # 抛出异常
new_func = partial(func, 5000-5000*0.005)  # 偏函数  给这个方法传入的参数是5000-5000*0.005 
new_func(mode='out')  # 转出 要扣手续费
print(money)
